package com.example.course.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.course.dto.ClassesDTO;
import com.example.course.dto.ClassesQueryDTO;
import com.example.course.service.ClassesService;
import com.example.course.tool.R;
import com.example.course.vo.ClassesVO;
import com.example.course.vo.StudentVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 班级控制器，处理与班级相关的HTTP请求
 *
 * @author Jasmine-drs
 * @date 2025/4/23 10:30
 */
@Slf4j
@RestController
@RequestMapping("/classes")
@AllArgsConstructor
@Api(tags = "班级管理接口")
public class ClassesController {
	private final ClassesService classesService;

	/**
	 * 获取班级列表
	 *
	 * @param queryDTO 查询条件
	 * @return 班级列表
	 */
	@GetMapping
	@ApiOperation("获取班级列表")
	public R<Page<ClassesVO>> getClassesList(@Valid ClassesQueryDTO queryDTO) {
		log.info("请求获取班级列表：{}", queryDTO);

		try {
			// 调用服务层获取班级列表
			Page<ClassesVO> page = classesService.getClassesList(queryDTO);
			return R.success(page);
		} catch (Exception e) {
			log.error("获取班级列表异常", e);
			return R.err("获取班级列表失败：" + e.getMessage());
		}
	}

	/**
	 * 获取班级详情
	 *
	 * @param id 班级ID
	 * @return 班级详情
	 */
	@GetMapping("/{id}")
	@ApiOperation("获取班级详情")
	public R<ClassesVO> getClassDetail(@ApiParam(value = "班级ID", required = true) @PathVariable Integer id) {
		log.info("请求获取班级详情，ID：{}", id);

		try {
			// 调用服务层获取班级详情
			ClassesVO classesVO = classesService.getClassById(id);
			return R.success(classesVO);
		} catch (IllegalArgumentException e) {
			log.warn("获取班级详情参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("获取班级详情异常", e);
			return R.err("获取班级详情失败：" + e.getMessage());
		}
	}

	/**
	 * 添加班级（教师功能）
	 *
	 * @param classesDTO 班级信息
	 * @return 添加结果
	 */
	@PostMapping
	@ApiOperation("添加班级（教师功能）")
	public R<ClassesVO> addClass(@ApiParam(value = "班级信息", required = true) @Valid @RequestBody ClassesDTO classesDTO) {
		log.info("请求添加班级：{}", classesDTO);

		try {
			// 调用服务层添加班级
			ClassesVO classesVO = classesService.addClass(classesDTO);
			return R.success(classesVO);
		} catch (IllegalArgumentException e) {
			log.warn("添加班级参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("添加班级异常", e);
			return R.err("添加班级失败：" + e.getMessage());
		}
	}

	/**
	 * 删除班级
	 *
	 * @param id 班级ID
	 * @return 删除结果
	 */
	@DeleteMapping("/{id}")
	@ApiOperation("删除班级")
	public R<Boolean> deleteClass(@ApiParam(value = "班级ID", required = true) @PathVariable Integer id) {
		log.info("请求删除班级，ID：{}", id);

		try {
			// 调用服务层删除班级
			boolean result = classesService.deleteClass(id);
			return R.success(result);
		} catch (IllegalArgumentException e) {
			log.warn("删除班级参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("删除班级异常", e);
			return R.err("删除班级失败：" + e.getMessage());
		}
	}

	/**
	 * 获取班级内的学生列表
	 *
	 * @param id 班级ID
	 * @return 学生列表
	 */
	@GetMapping("/{id}/students")
	@ApiOperation("获取班级内的学生列表")
	public R<List<StudentVO>> getClassStudents(@ApiParam(value = "班级ID", required = true) @PathVariable Integer id) {
		log.info("请求获取班级内的学生列表，班级ID：{}", id);

		try {
			// 调用服务层获取班级内的学生列表
			List<StudentVO> students = classesService.getStudentsByClassId(id);
			return R.success(students);
		} catch (IllegalArgumentException e) {
			log.warn("获取班级内的学生列表参数异常", e);
			return R.err(e.getMessage());
		} catch (Exception e) {
			log.error("获取班级内的学生列表异常", e);
			return R.err("获取班级内的学生列表失败：" + e.getMessage());
		}
	}
} 